﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bastanteo.Dominio;
using Bastanteo.Persistencia;
using NUnit.Framework;

namespace Bastanteo.Pruebas
{
    public class Test6_BastanteoCombinacionDAO
    {
        IBastanteoCombinacionDAO bastanteoCombinacionDAO = null;
        IBastanteoDAO bastanteoDAO = null;
        IGrupoDAO grupoDAO = null;
        IPoderDAO poderDAO = null;

        Grupo codigoGrupo = null;
        Poder codigoPoder = null;
        CBastanteo cBastanteo = null;

        Int32 NuevoBastanteoCombinacion = 0;
        Int32 NuevoBastanteo = 0;
        Int32 NuevoGrupo = 0;
        Int32 NuevoPoder = 0;

        BastanteoCombinacion bastanteoCombinacionCreado = null;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            bastanteoCombinacionDAO = new Persistencia.NH.BastanteoCombinacionDAO(); // Instanciamos la implementación elegida (ADO o NHibernate)
            grupoDAO = new Persistencia.NH.GrupoDAO();
            poderDAO = new Persistencia.NH.PoderDAO();
            bastanteoDAO = new Persistencia.NH.BastanteoDAO();

            codigoGrupo = grupoDAO.Crear(new Grupo() { Descripcion = "GRUPO 01" });
            NuevoGrupo = codigoGrupo.CodigoGrupo;
            
            codigoPoder = poderDAO.Crear(new Poder() { Descripcion = "PODER", TipoProducto = "Z" });
            NuevoPoder  = codigoPoder.CodigoPoder;

            cBastanteo = bastanteoDAO.Crear(new CBastanteo() { CodigoGrupo = grupoDAO.Obtener(NuevoGrupo), CodigoPoder = poderDAO.Obtener(NuevoPoder), ImporteLimite = 20.00, FechaVencimiento = DateTime.Now, TipoIntervencion = "A" });
            NuevoBastanteo = cBastanteo.CodigoBastanteo ;

            foreach (BastanteoCombinacion bastanteoCombinacion in bastanteoCombinacionDAO.ListarTodos())
                bastanteoCombinacionDAO.Eliminar(bastanteoCombinacion);


        }

        [Test]
        public void Test1_Crear()
        {
            // 1. Validar que ocurra un error al intentar crear un Bastanteo con un dato nulo
            BastanteoCombinacion combinacionACrear = new BastanteoCombinacion();
            combinacionACrear.CodigoBastanteo = null;
            combinacionACrear.Grupo = null;
            Assert.Catch<Exception>(delegate
            {
                bastanteoCombinacionCreado = bastanteoCombinacionDAO.Crear(combinacionACrear);
            });

            combinacionACrear.CodigoBastanteo = cBastanteo;
            combinacionACrear.Grupo = codigoGrupo;
            Assert.DoesNotThrow(delegate
            {
                bastanteoCombinacionCreado = bastanteoCombinacionDAO.Crear(combinacionACrear);
            });
            NuevoBastanteoCombinacion = bastanteoCombinacionCreado.CodigoBastanteoCombinacion;
            Assert.IsNotNull(bastanteoCombinacionCreado);
            Assert.Greater(bastanteoCombinacionCreado.CodigoBastanteoCombinacion , 0);
            Assert.AreEqual(bastanteoCombinacionCreado.CodigoBastanteoCombinacion, combinacionACrear.CodigoBastanteoCombinacion);

        }
        
        [Test]
        public void Test2_Obtener()
        {
            BastanteoCombinacion bastanteocombinacionObtenido = null;
            // 1. Validar que se retorne nulo al obtener un Bastanteo inexistente
            Assert.DoesNotThrow(delegate
            {
                bastanteocombinacionObtenido = bastanteoCombinacionDAO.Obtener(0);
            });
            Assert.IsNull(bastanteocombinacionObtenido);

            // 2. Validar que se obtenga el Bastanteo creado satisfactoriamente
            Assert.DoesNotThrow(delegate
            {
                bastanteocombinacionObtenido = bastanteoCombinacionDAO.Obtener(bastanteoCombinacionCreado.CodigoBastanteoCombinacion);
            });
            Assert.IsNotNull(bastanteocombinacionObtenido);

            // 3. Validar que el "CodigoBastanteoCombinacion" obtenido sea el creado anteriormente
            Assert.AreEqual(bastanteocombinacionObtenido.CodigoBastanteoCombinacion, NuevoBastanteoCombinacion); //
        }


        [Test]
        public void Test3_Modificar()
        {
            BastanteoCombinacion bastanteoCombinacionAModificar = bastanteoCombinacionDAO.Obtener(bastanteoCombinacionCreado.CodigoBastanteoCombinacion);
            bastanteoCombinacionAModificar.CodigoBastanteo = null;
            bastanteoCombinacionAModificar.Grupo = null;

            BastanteoCombinacion bastanteoCombinacionModificado = null;

            Assert.Catch<Exception>(delegate
            {
                bastanteoCombinacionModificado = bastanteoCombinacionDAO.Modificar(bastanteoCombinacionAModificar);
            });
 
            bastanteoCombinacionAModificar.CodigoBastanteo = cBastanteo ;
            bastanteoCombinacionAModificar.Grupo = codigoGrupo;


            Assert.DoesNotThrow(delegate
            {
                bastanteoCombinacionModificado = bastanteoCombinacionDAO.Modificar(bastanteoCombinacionAModificar);
            });
  
            Assert.IsNotNull(bastanteoCombinacionModificado);
            Assert.AreEqual(bastanteoCombinacionAModificar.CodigoBastanteo , bastanteoCombinacionModificado.CodigoBastanteo);
         }

        
        [Test]
        public void Test4_Eliminar()
        {
            BastanteoCombinacion bastanteoCombinacionAEliminar = bastanteoCombinacionDAO.Obtener(bastanteoCombinacionCreado.CodigoBastanteoCombinacion);
            // 1. Validar que ocurre un error si se intenta eliminar un BastanteoCombinacion nulo
            Assert.Catch<Exception>(delegate
            {
                bastanteoCombinacionDAO.Eliminar(null);
            });
            // 2. Validar que se elimina correctamente el BastanteoCombinacion creado
            Assert.DoesNotThrow(delegate
            {
                bastanteoCombinacionDAO.Eliminar(bastanteoCombinacionAEliminar);
            });
            // 3. Validar que luego de eliminado se retorne nulo al obtenerlo
            BastanteoCombinacion bastanteoEliminado = bastanteoCombinacionDAO.Obtener(bastanteoCombinacionCreado.CodigoBastanteoCombinacion); //?????
            Assert.IsNull(bastanteoEliminado);

        }
         
                  
        [Test]
        public void Test5_Listar()
        {

            bastanteoCombinacionDAO.Crear(new BastanteoCombinacion() { CodigoBastanteo = bastanteoDAO.Obtener(NuevoBastanteo), Grupo = grupoDAO.Obtener(NuevoGrupo) });

            ICollection<BastanteoCombinacion> combinacionesExistentes = null;
            Assert.DoesNotThrow(delegate
            {
                combinacionesExistentes = bastanteoCombinacionDAO.ListarTodos();
            });

            Assert.GreaterOrEqual(combinacionesExistentes.Count, 1);

            foreach (BastanteoCombinacion grupo in combinacionesExistentes)
                Assert.IsNotNull(grupo.CodigoBastanteo);
        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            foreach (BastanteoCombinacion CombinacionBastanteo in bastanteoCombinacionDAO.ListarTodos())
                bastanteoCombinacionDAO.Eliminar(CombinacionBastanteo);
       
            bastanteoDAO.Eliminar(cBastanteo);
            poderDAO.Eliminar(codigoPoder);
            grupoDAO.Eliminar(codigoGrupo);

                Persistencia.NH.NHibernateHelper.CerrarFabrica();
             }
        
         
            }
}